Al intentar validar la entrada del usuario, una cadena de entrada de "1,5" da como resultado una fecha válida:
var s = "1,5"; DateTime d; var b = DateTime.TryParse(s, CultureInfo.InvariantCulture, DateTimeStyles.None, out d); Console.WriteLine("s: " + s); Console.WriteLine("b: " + b); Console.WriteLine("d: " + d);La salida es:
s: 1,5 b: True d: 1/5/2021 12:00:00 AMMi intención era que "1,5" no se considere como un DateTime válido. Obviamente, estoy equivocado.
Probé esto tanto en .NET Framework 4.8 como en .NET Core 5 con los mismos resultados.
Después de revisar las fuentes .NET del método DateTime.TryParse , todavía no puedo entender por qué se considera una fecha válida.
Además, me encantaría evitar de alguna manera que el método reconozca esto como una fecha válida. Mi conjetura es ir con DateTime.TryParseExact pero tal vez haya mejores opciones.
DateTime.TryParse en cultura invariable considera "1,5" como una fecha válida?Lo está analizando como "Mes, Día" en el año actual, por eso lo permite.
DateTime.TryParse() es notoriamente permisivo: el consejo generalmente es usar DayTime.TryParseExact() para evitar tales cosas (como usted mismo sugiere).
No hay mejor manera de resolver esto que usar DateTime.TryParseExact() .
Este comportamiento está realmente documentado :
Este método intenta ignorar los datos no reconocidos, si es posible, y completa la información faltante del mes, día y año con la fecha actual. Si s contiene solo una fecha y ninguna hora, este método asume que la hora es a las 12:00 de la noche.
Por lo tanto, analiza el mes y el número de día, y luego establece el año en el año de la fecha actual y la hora en la medianoche.